package app

import (
	"fmt"
	"os"
	"runtime/debug"

	"gitee.com/MM-Q/fastlog"
	"github.com/jmoiron/sqlx"
)

// Run 运行程序
func Run() {
	// 初始化应用程序
	log, db, initErr := appInit()
	if initErr != nil {
		fmt.Println("应用程序初始化失败:", initErr)
		os.Exit(1)
	}

	// 捕获 panic 和 在返回时关闭资源
	defer func() {
		if r := recover(); r != nil {
			//fmt.Println("应用程序崩溃:", r)
			log.Errorf("应用程序崩溃: %v", r)
		}

		// 关闭资源
		log.Info("uni-core 关闭中...")
		closeResources(log, db)
	}()

	// 设置 GOGC 环境变量: 设置垃圾回收的百分比
	// 50% 的垃圾回收时间
	debug.SetGCPercent(50)

	// 主应用逻辑
	w := appInitUi(db, log)
	log.Success("uni-core 启动成功")

	// 运行应用程序
	w.ShowAndRun()
}

// 集中处理资源关闭
func closeResources(log *fastlog.FastLog, db *sqlx.DB) {
	if db != nil {
		if err := db.Close(); err != nil {
			if log != nil {
				log.Errorf("关闭数据库连接失败: %v", err)
			}
		}
	}

	if log != nil {
		if err := log.Close(); err != nil {
			fmt.Printf("关闭日志失败: %v\n", err)
		}
	}
}
